import { showMsg } from './showMsg'
import { layout } from './layout'
import axios from 'axios'
import { playCloseSound } from './playSounds'

export function setupWebSocket(canvasFingerprint, vm)
{
  // 创建 WebSocket 连接
  const ws = new WebSocket('ws://localhost:3000')

  ws.onopen = () =>
  {
    showMsg('WS服务器', 'WebSocket 连接已建立', 'success')
    // 发送 Canvas 指纹到后端
    ws.send(
      JSON.stringify({
        type: 'canvasFingerprint',
        canvasFingerprint
      })
    )
  }

  ws.onmessage = (event) =>
  {
    const data = JSON.parse(event.data)
    console.log('收到服务器消息:', data)
    if (
      data.data !== null &&
      typeof data.data === 'string' &&
      data.data.slice(0, 1) === 'c'
    )
    {
      axios.post('/node/cabinets/close', {
        belong: '厚德苑',
        number: data.data.slice(6, 7)
      })
        .then(res =>
        {
          layout(vm, true)
          playCloseSound()
          showMsg(res.data.data + ',欢迎下次使用!', null, 'success')
        })
        .catch(e =>
        {
          showMsg(e, null, 'error')
        })
    }
    // 处理服务器返回的消息
    if (data.type === 'broadcast')
      console.log('广播消息:', data.message)
    else if (data.type === 'forceLogout')
    {
      showMsg('服务器要求退出登录:', data.message, 'warning')
      vm.$store.dispatch('logout')
      showMsg('登出成功', '👋 期待再次见到你~', 'success')
      vm.$router.push('/login')
    }
  }

  ws.onclose = function(event)
  {
    const { code } = event // 还有 reason 属性可以提取
    if (code === 4002)
    {
      // 如果是账号已在别处登录
      vm.$store.dispatch('logout') // 调用退出登录的逻辑
      showMsg('WS 服务器', '账号已在别处登录，请重新登录', 'error')
      vm.$router.push('/login')
    }
    else
    {
      // 其他关闭原因
      vm.$store.dispatch('logout')
      showMsg('WS 服务器', '端点离开，请重新登录', 'error')
      vm.$router.push('/login')
    }
  }

  ws.onerror = (error) =>
  {
    showMsg('WS 服务器', 'WebSocket 错误:' + error, ' error')
  }

  return ws // 返回 WebSocket 实例，方便后续操作
}
